package fr.mma.livraison.controller;

import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

import fr.mma.achievement.dao.AchievementDao;
import fr.mma.livraison.dao.DevDao;
import fr.mma.livraison.model.dto.DeveloppeurDTO;
import fr.mma.livraison.model.persistence.Developpeur;

public class DevController {

	private static final DevDao DEV_DAO = new DevDao();
	private static final AchievementDao ACHIEVEMENT_DAO = new AchievementDao();

	private static Map<OrderType, Comparator<Developpeur>> devComparator = new HashMap<OrderType, Comparator<Developpeur>>();
	static {
		devComparator.put(OrderType.NAME, new Comparator<Developpeur>() {
			@Override
			public int compare(final Developpeur dev1, final Developpeur dev2) {
				return dev1.getName().compareTo(dev2.getName());
			}
		});
		devComparator.put(OrderType.LIVRAISON, new Comparator<Developpeur>() {
			@Override
			public int compare(final Developpeur dev1, final Developpeur dev2) {
				if (dev1.getLastLivraison() < dev2.getLastLivraison()) {
					return -1;
				}
				if (dev1.getLastLivraison() > dev2.getLastLivraison()) {
					return 1;
				}
				return 0;
			}
		});
		devComparator.put(OrderType.NB_LIVRAISON, new Comparator<Developpeur>() {
			@Override
			public int compare(final Developpeur dev1, final Developpeur dev2) {
				if (dev1.getNombreLivraison() < dev2.getNombreLivraison()) {
					return -1;
				}
				if (dev1.getNombreLivraison() > dev2.getNombreLivraison()) {
					return 1;
				}
				return devComparator.get(OrderType.LIVRAISON).compare(dev1, dev2);
			}
		});
	}

	public List<Developpeur> getAllDev() {
		final List<Developpeur> devList = DEV_DAO.getAll();
		for (Developpeur developpeur : devList) {
			developpeur.setAchievements(ACHIEVEMENT_DAO.getByDeveloppeur(developpeur));
		}
		return devList;
	}

	public Collection<Developpeur> getAllDev(final OrderType orderType) {
		final List<Developpeur> devList = getAllDev();
		Collections.sort(devList, devComparator.get(orderType));
		return devList;
	}

	public Developpeur getDevByTrigram(final String trigram) {
		Developpeur developpeur = null;
		for (Developpeur dev : getAllDev()) {
			if (dev.getTrigram().equals(trigram)) {
				developpeur = dev;
				break;
			}
		}
		return developpeur;
	}

	public Developpeur getDevId(final String id) {
		return DEV_DAO.get(id);
	}

	public void save(final DeveloppeurDTO devDTO) {
		String key = StringUtils.remove(devDTO.getTrigram(), ".");
		key = StringUtils.remove(key, "#");
		final Developpeur dev = DEV_DAO.getOrCreate(key);
		dev.setLastLivraison(Factory.build(devDTO.getLastLivraison()));
		dev.setName(devDTO.getName());
		dev.setNombreLivraison(Integer.valueOf(devDTO.getNombreLivraison()));
		DEV_DAO.save(dev);
	}

	public void save(final Collection<DeveloppeurDTO> devDTOList) {
		for (DeveloppeurDTO devDTO : devDTOList) {
			save(devDTO);
		}
	}

}
